/*! ******************************************************************************
 *
 * Created on 2021年9月25日
 *
 * Copyright(c) YuZhou Big Data Laboratory CO.,Ltd, 2022.  All rights reserved.
 *
 *******************************************************************************
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 ******************************************************************************/

package org.yzbdl.lanius.util;

import cn.hutool.core.lang.Console;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.vfs2.*;

import java.io.IOException;

/**
 * VFS工具类
 *
 * @author tanp@yzbdl.ac.cn
 */
public class VFS2Utils {

    private static FileSystemManager fsm = null;

    static {
        try {
            VFS2Utils.fsm = VFS.getManager();
        } catch (FileSystemException e) {
            e.printStackTrace();
        }
    }

    /**
     * 判断路径是否是目录
     *
     * @param path
     * @return
     */
    public static boolean isDirectory(String path) {
        try {
            FileObject fo = VFS2Utils.fsm.resolveFile(path);
            return fo.getType().equals(FileType.FOLDER);
        } catch (FileSystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 删除指定路径
     *
     * @param path
     */
    public static void delete(String path) {
        try {
            FileObject fo = VFS2Utils.fsm.resolveFile(path);
            fo.delete();
        } catch (FileSystemException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    /**
     * 函数描述：根据传入的文件路径创建文件夹(包括各级父文件夹)。如果路径中有文件，会自动去掉文件名。 （文件的判断是
     * 以最后一个"/"之后是否有"."为标识的，）
     *
     * @param path
     * @return 如果创建成功，返回true；否则，返回false;
     */
    public static boolean mkdirs(String path) {
        String realPath = "";
        path = path.replaceAll("\\\\", "/");
        // 如果该路径已"/"结尾，则整个字符串都是路径
        if (path.endsWith("/")) {
            realPath = path;
        } else {
            int fileNamePoint = path.lastIndexOf("/");
            // 获取真正的路径
            if (fileNamePoint >= 0) {
                realPath = path.substring(0, fileNamePoint);
            }
            // 读取文件名
            String fileName = path.substring(fileNamePoint + 1);
            // 如果读取的文件名中没有"."，说明整个字符串都是路径
            if (fileName.indexOf(".") < 0) {
                realPath = path;
            }
        }
        try {
            FileObject fo = VFS2Utils.fsm.resolveFile(realPath);
            fo.createFolder();
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 函数描述：对文件进行copy
     *
     * @param sourceFilePath 源文件的全部路径+文件名
     * @param targetFilePath 目标文件的全部路径+文件名
     * @param overWrite      如果目标文件存在，是否覆盖。true:覆盖；false:不覆盖(当源文件和目标文件都存在并且不覆盖时,返回true)。
     * @return true:成功；false:失败; (当源文件和目标文件都存在并且不覆盖时,返回true)。
     */
    public static boolean copyFile(String sourceFilePath, String targetFilePath, boolean overWrite) throws IOException {
        if (StringUtils.isBlank(sourceFilePath) || StringUtils.isBlank(targetFilePath)) {
            throw new IOException("源文件或者目标文件为空");
        }
        FileObject from = VFS2Utils.fsm.resolveFile(sourceFilePath);
        FileObject to = VFS2Utils.fsm.resolveFile(targetFilePath);
        if (to.exists()) {
            if (to.getType() == FileType.FILE) {
                if (overWrite && !to.delete()) {
                    throw new IOException("目标文件[" + targetFilePath + "]被保护，不能被覆盖！");
                } else if (!overWrite) {
                    throw new IOException("目标文件[" + targetFilePath + "]已经存在！");
                }
            }
        }
        to.copyFrom(from, Selectors.SELECT_ALL);
        return true;
    }

    /**
     * Moving a File to Another File ,没有进行磁盘空间大小的判断
     *
     * @param srcFile    源文件 eg: c:\windows\abc.txt
     * @param targetFile 目标文件 eg: c:\temp\abc.txt
     * @param overWrite  如果目标文件存在，是否覆盖
     * @return success
     */

    public static boolean moveFile(String srcFile, String targetFile, boolean overWrite) throws IOException {
        if (srcFile.equals(targetFile)) {
            return true;
        }
        FileObject src = VFS2Utils.fsm.resolveFile(srcFile);
        // File (or directory) to be moved
        if (StringUtils.isNotBlank(srcFile) && !src.exists()) {
            throw new IOException("源文件[" + srcFile + "]不存在");
        }
        // Destination directory
        FileObject to = VFS2Utils.fsm.resolveFile(targetFile);
        if (to.exists()) {
            if (to.getType() == FileType.FILE) {
                if (overWrite && !to.delete()) {
                    throw new IOException("目标文件[" + targetFile + "]被保护，不能被覆盖！");
                } else if (!overWrite) {
                    Console.log("目标文件[" + targetFile + "]已经存在！当前文件将直接被删除！");
                    return false;
                }
            }
        }
        src.moveTo(to);
        return true;
    }

}
